/**
 * 获取 时间
 * @param {String} format 时间格式 默认yyyy-MM-dd HH:mm:ss
 * @param {Number} times 时间戳 默认当前时间
 * @returns {String}
 */
export function getTime({
  format = 'yyyy-MM-dd HH:mm:ss',
  times,
}: {
  format?: any
  times?: number
}) {
  const T = times ? new Date(+times) : new Date()

  const toTwo = (num: any) => (num > 9 ? '' + num : '0' + num)

  if (/day/.test(format)) format = format.replace(/day/g, T.getDay())
  if (/week/.test(format)) {
    format = format.replace(
      /week/g,
      ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'][
        T.getDay()
      ],
    )
  }
  if (/yyyy/.test(format)) format = format.replace(/yyyy/g, T.getFullYear())
  if (/MM/.test(format)) format = format.replace(/MM/g, toTwo(T.getMonth() + 1))
  if (/M/.test(format)) format = format.replace(/M/g, T.getMonth() + 1)
  if (/dd/.test(format)) format = format.replace(/dd/g, toTwo(T.getDate()))
  if (/d/.test(format)) format = format.replace(/d/g, T.getDate())
  if (/HH/.test(format)) format = format.replace(/HH/g, toTwo(T.getHours()))
  if (/H/.test(format)) format = format.replace(/H/g, T.getHours())
  if (/hh/.test(format)) {
    format = format.replace(
      /hh/g,
      toTwo(T.getHours() - 12 > 0 ? T.getHours() - 12 : T.getHours()),
    )
  }
  if (/h/.test(format)) {
    format = format.replace(
      /h/g,
      T.getHours() - 12 > 0 ? T.getHours() - 12 : T.getHours(),
    )
  }
  if (/mm/.test(format)) format = format.replace(/mm/g, toTwo(T.getMinutes()))
  if (/m/.test(format)) format = format.replace(/m/g, T.getMinutes())
  if (/ss/.test(format)) format = format.replace(/ss/g, toTwo(T.getSeconds()))
  if (/s/.test(format)) format = format.replace(/s/g, T.getSeconds())

  return format
}

/* times 时间戳
---------------------------------------------------------------- */
/**
 * 获取 时间戳
 * @param {String} date 时间格式,如yyyy-MM-dd HH:mm:ss
 * @returns {Number}
 */
export function getTimes({ date }: { date: string }) {
  const D = date ? date.replace(/-/g, '/') : '' // 把所有-转化成/
  return D ? new Date(D).getTime() : new Date().getTime()
}

/* date 日期
---------------------------------------------------------------- */
/**
 * 日期对比 判断:开始日期小于结束日期
 * @param {String} start 开始日期,如2020-8-1
 * @param {Object} end 结束日期,如2020/8/2
 * @returns {Boolean} 若参数有误则返回false
 */
export function compareDate({ start, end }: { start: string; end: string }) {
  if (!start || !end) {
    console.warn({ message: '参数有误', start, end, function: compareDate })
    return false
  }

  // start = start.replace(/-/g, '/') // 替换字符，变成标准格式
  // end = end.replace(/-/g, '/') // 替换字符，变成标准格式
  // return new Date(Date.parse(start)) < new Date(Date.parse(end))
  return new Date(start).getTime() < new Date(end).getTime()
}

/**
 * 获取 季度
 * @param {String} date 时间格式,如yyyy-MM-dd
 * @param {Number} index 根据index返回第几季度，若无则返回date当前季度 1 2 3 4
 * @param {String} near 附近季度 prev前一个 next后一个 默认无
 * @returns {Array} data 全部季度
 * @returns {String} start 开始时间 当前季度
 * @returns {String} end 结束时间 当前季度
 */
export function getQuarter({
  date,
  index,
  near,
}: {
  date: string
  index?: number
  near?: string
}) {
  date = date || getTime({ format: 'yyyy-MM-dd' })
  let Y: any = date.substr(0, 4)
  const M: any = date.substr(5, 2)

  const data = [
    { start: `${Y}-01-01`, end: `${Y}-03-31` },
    { start: `${Y}-04-01`, end: `${Y}-06-30` },
    { start: `${Y}-07-01`, end: `${Y}-09-30` },
    { start: `${Y}-10-01`, end: `${Y}-12-31` },
  ]

  let start, end

  index = index || Math.ceil(M / 3)

  if (near) {
    switch (near) {
      case 'prev':
        index--
        if (index > 0) break

        Y--
        index = 4
        start = `${Y}-10-01`
        end = `${Y}-12-31`

        break
      case 'next':
        index++
        if (index < 5) break

        Y++
        index = 1
        start = `${Y}-01-01`
        end = `${Y}-03-31`

        break
    }
  }

  start = start || data[index - 1].start
  end = end || data[index - 1].end

  return { data, start, end, index, year: Y }
}

/* other 其他
---------------------------------------------------------------- */
/**
 * 获取 某个月的天数
 * @param {String}  yearMonth 年月份,例2020-8|2020-08|2002/8|2020.8,若无则返回当月的天数
 * @returns {Number} 返回该月的天数
 */
export function getDayByMonth({ yearMonth }: { yearMonth?: string }) {
  let YM = yearMonth || getTime({ format: 'yyyy-MM' })

  const Y = YM.substr(0, 4)
  const M = YM.substr(5, 2)
  return new Date(Y, M, 0).getDate()
}
